package com.demo.atm;

import javax.smartcardio.Card;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    //ArrayList集合里面是存放<Account>类型的数据，名字叫accounts，按照封装的思想private私有
    private ArrayList<Account> accounts = new ArrayList<>();
    private Scanner scanner = new Scanner(System.in, "UTF-8");


    /**
     * 启动ATM系统，展示欢迎界面
     **/
    public void start() {
        while (true) {
            System.out.println("==欢迎您进入到ATM系统界面==");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("请选择：");
            int command = scanner.nextInt();
            switch (command) {
                case 1:
//                用户登录
                    login();
                    break;
                case 2:
//                用户开户
                    createAccount();
                    break;
                default:
                    System.out.println("没有该操作");
                    break;
            }
        }


    }

    /**
     * 完成用户的登录操作
     */
    public void login() {
        System.out.println("==系统登录界面==");
        //1.判断系统中是否存在账户对象
        //没有对象，跳出,//有对象,可以进行后续登录操作
        if (accounts.size() == 0) {
            System.out.println("当前系统中未存在任何账户！");
            return;
        }
        while (true) {
            //2.有账户对象，可以进行登录操作了
            System.out.println("输入您的账号");
            String cardId = scanner.next();
            //3.判断输入的账号是否存在
            Account acc = getAccountByCardId(cardId);//accounts是集合的名字，acc是Account类的实体对象
            if (acc == null) {
                //账号不存在，则让用户重新输入
                System.out.println("输入的卡号不存在，请重新输入");
            } else {
                while (true) {
                    //4.账号正确时输入的密码是否正确
                    System.out.println("请输入密码");
                    String password = scanner.next();
                    if (acc.getPassword().equals(password)) {
                        //账号正确，密码正确，完成登录
                        System.out.println("欢迎您" + acc.getUsername()+"成功登录！您的卡号为："+acc.getCardId());
                    }else{
                        //账号正确，密码错误，提示重新输入
                        System.out.println("请检查密码输入是否有误！");
//                        System.out.println("按1操作继续，否则退出登录操作");
//                        int controlNumber = scanner.nextInt();
//                        if(controlNumber==1){
//                            continue;
//                        }else {
//                            System.out.println("退出登录操作");
//                            break;
//                        }
                    }
                }
            }
    }

}


/**
 * 完成用户开户操作
 */
private void createAccount() {
    System.out.println("====系统开户操作====");
    //1.创建一个账户对象，用户封装用户的开户信息
    Account acc = new Account();
    //2.需要用户输入自己的开户信息，赋值给账户对象
    System.out.println("请您输入您的账户名称");
    String name = scanner.next();
    acc.setUsername(name);

    while (true) {
        System.out.println("请输入您的性别，男性输入1，女性输入2");
        char sex = scanner.next().charAt(0);//男
        if (sex == '1' || sex == '2') {
            acc.setSex(sex);
            break;
        } else {
            System.out.println("请输入数字“男1/女2");
        }
    }

    while (true) {
        System.out.println("请输入您的账户密码！");
        String password = scanner.next();
        System.out.println("请再次输入您的账户密码！");
        String okPassword = scanner.next();
        //判断2次输入密码是否一样
        if (password.equals(okPassword)) {
            acc.setPassword(okPassword);
            break;
        } else {
            System.out.println("您两次输入的密码不一致，请重新输入！");
        }
    }

    System.out.println("请输入您的取现额度");
    double limit = scanner.nextDouble();
    acc.setLimit(limit);
/**
 * 返回一个8位数的卡号，而且这个卡号不能与其他卡号重复
 */
    String newCardId = createCardId();
    acc.setCardId(newCardId);
    //3.把这个账户对象，存入到账户集合中
    accounts.add(acc);
    System.out.println("恭喜您，" + acc.getUsername() + "！开户成功！您的卡号是："
            + acc.getCardId());


}


private String createCardId() {
    while (true) {
//        定义一个String类型的变量记住8位数字为一个新卡号
        String cardId = "";
        //使用循环，循环8次，每次产生一个随机数
        Random random = new Random();
        for (int i = 0; i < 8; i++) {
            int data = random.nextInt(10);//0-9
            cardId += data;
        }
        //3.判断cardId中记住的卡号，是否与账户中其他卡号重复了，没有重复，才可以作为一个新卡号返回。
        Account account = getAccountByCardId(cardId);
        if (account == null) {
            //            cardID没有找到账户对象，因此可以返回cardID
            return cardId;
        }
    }
}

//根据卡号查询账户对象返回accounts=[c1,c2,c3...]
private Account getAccountByCardId(String cardId) {
    //遍历全部的账户对象
    for (int i = 0; i < accounts.size(); i++) {
        Account account = accounts.get(i);
        //判断这个账户对象account中的卡号是否是我们要找的卡号
        if (account.getCardId().equals(cardId)) {
            return account;
        }
// 看到了吗 cardid是null 看下为什么是null  你思考下逻辑 id是哪里来的 id是for循环生成八个随机数，在传给acc，调用getCardId方法
        // 那你的这个account的的cardid就i是null 你是不是该查查生成cardid和给cardid赋值的时候有问题  accouunts 就有问题
        //
    }
    return null;//查无此账户
}
}
